###########################################################################
# Sample php applications using the Aastra XML API Classes
# Aastra SIP Phones Firmware 2.3.0 or better
# Copyright Aastra Telecom 2008
#
# Ruby adaptation by Carlton O'Riley
#
# /aastra_sample/{type} where type is the object to display
# 	type=textmenu1 AastraIPPhoneTextMenu
# 	type=textmenu2 AastraIPPhoneTextMenu
# 	type=textmenu3 AastraIPPhoneTextMenu
# 	type=textscreen AastraIPPhoneTextScreen
# 	type=directory AastraIPPhoneDirectory
# 	type=inputscreen1 AastraIPPhoneInputScreen
# 	type=inputscreen2 AastraIPPhoneInputScreen
# 	type=inputscreen3 AastraIPPhoneInputScreen
# 	type=inputscreen4 AastraIPPhoneInputScreen
# 	type=status AastraIPPhoneStatus
# 	type=execute AastraIPPhoneExecute
# 	type=configuration AastraIPPhoneConfiguration
# 	type=imagescreen AastraIPPhoneImageScreen
# 	type=imagemenu AastraIPPhoneImageMenu
# 	type=formattedtextscreen AastraIPPhoneFormattedTextScreen
#
# If type is not set, the list of all the XML objects is displayed
# i.e. http://railsserver:3000/aastra_sample
###########################################################################

class AastraSampleController < ApplicationController
  require 'AastraIPPhoneExecute.rb'
  require 'AastraIPPhoneFormattedTextScreen.rb'
  require 'AastraIPPhoneTextMenu.rb'
  require 'AastraIPPhoneTextScreen.rb'
  require 'AastraIPPhoneConfiguration.rb'
  require 'AastraIPPhoneDirectory.rb'
  require 'AastraIPPhoneInputScreen.rb'
  require 'AastraIPPhoneImageScreen.rb'
  require 'AastraIPPhoneImageMenu.rb'
  require 'AastraIPPhoneStatus.rb'

  before_filter :check_aastra
  after_filter :set_headers

  def check_aastra
    return if aastra_test_phone_version('2.2.0', 0) != 0
    @userHeader = aastra_decode_HTTP_header
  end

  def set_headers
    if not @aastraObj.nil? then
      headers['Content-Type'] = "text/xml; charset=ISO-8859-1"
      headers['Refresh'] = "#{@aastraObj.getRefreshTimeout}; url=#{@aastraObj.getRefreshURL}" if @aastraObj.getRefreshTimeout != 0 and not @aastraObj.getRefreshURL.nil?
      headers['Content-Length'] = @xml.length
    end
  end

  def aastra_output(aastraObj=nil)
    @aastraObj = aastraObj
    @xml = '<?xml version="1.0" encoding="ISO-8859-1"?>'+"\n"
    @xml += @aastraObj.render
    puts "SENDING:\n#{@xml}"
    render :action => "aastra_output"
  end

  def aastra_decode_HTTP_header
    user_agent = request.headers['HTTP_USER_AGENT']
    if not user_agent.index(/Aastra/i).nil? then
      value = user_agent.split(/ MAC:/)
      fin = value[1].split(/ /)
      value[1] = fin[0].sub(/\-/,"")
      value[2] = fin[1].sub(/V:/,"")
    else
      value = ["MSIE", "NA", "NA"]
    end
    return {'model' => value[0], 'mac' => value[1], 'firmware' => value[2]}
  end

  def aastra_test_phone_model(models, check, type)
    userHeader = aastra_decode_HTTP_header
    return true if models.include?(userHeader['model']) == check
    if type == 0 then
       aastraObj = AastraIPPhoneTextScreen.new
       aastraObj.setTitle("Phone not supported")
       aastraObj.setText("This XML application is not supported by your phone.")
       aastra_output aastraObj
    end
    return false
  end

  def aastra_test_phone_version(version, type)
    ret = 0
    # Start with the HTTP header
    userHeader = aastra_decode_HTTP_header
    # Must be an Aastra
    if not userHeader['model'].index(/Aastra/i).nil? then
      # Retrive firmware version
      piece = userHeader['firmware'].split(/\./)
      count = piece.size-1
      phone_version = piece[0].to_i*100
      phone_version += piece[1].to_i*10 if count > 1
      phone_version += piece[2].to_i if count > 2
      piece = version.split(/\./)
      count = piece.size-1
      test_version = piece[0].to_i*100
      test_version += piece[1].to_i*10 if count > 1
      test_version += piece[2].to_i if count > 2

      # Compare to passed version
      if test_version > phone_version then
        ret = 2
        if type == 0 then
          aastraObj = AastraIPPhoneTextScreen.new
          aastraObj.setTitle("Firmware not compatible")
          aastraObj.setText("This XML application needs firmware version #{version} or higher.")
          aastra_output aastraObj
        end
      end
    else
      ret = 1
      if type == 0 then
        @xml = "This XML application works better when using an Aastra IP phone, not a web browser.<p>See <a href=\"http://www.aastratelecom.com/cps/rde/xchg/SID-3D8CCB73-C78FC1E1/03/hs.xsl/23485.htm\">here</a> for instructions and information.<p>Copyright Aastra Telecom 2008."
        render :action => "aastra_output"
      end
    end
    return ret
  end

  def index
    aastraObj = AastraIPPhoneTextMenu.new
    aastraObj.setTitle('Sample Applications')
    aastraObj.setDestroyOnExit
    aastraObj.addEntry('Configuration', request.protocol+request.host_with_port+'/'+controller_name+'/configuration')
    aastraObj.addEntry('TextMenu1', request.protocol+request.host_with_port+'/'+controller_name+'/textmenu1')
    aastraObj.addEntry('TextMenu2', request.protocol+request.host_with_port+'/'+controller_name+'/textmenu2')
    aastraObj.addEntry('TextMenu3', request.protocol+request.host_with_port+'/'+controller_name+'/textmenu3')
    aastraObj.addEntry('TextScreen', request.protocol+request.host_with_port+'/'+controller_name+'/textscreen')
    aastraObj.addEntry('InputScreen1', request.protocol+request.host_with_port+'/'+controller_name+'/inputscreen1')
    aastraObj.addEntry('InputScreen2', request.protocol+request.host_with_port+'/'+controller_name+'/inputscreen2')
    aastraObj.addEntry('Status', request.protocol+request.host_with_port+'/'+controller_name+'/status')
    aastraObj.addEntry('Execute', request.protocol+request.host_with_port+'/'+controller_name+'/execute')
    case @userHeader['model']
      when 'Aastra55i', 'Aastra57i', 'Aastra57iCT'
        aastraObj.addEntry('ImageScreen', request.protocol+request.host_with_port+'/'+controller_name+'/imagescreen')
        aastraObj.addEntry('ImageMenu', request.protocol+request.host_with_port+'/'+controller_name+'/imagemenu')
        aastraObj.addEntry('Directory', request.protocol+request.host_with_port+'/'+controller_name+'/directory')
        aastraObj.addEntry('InputScreen3', request.protocol+request.host_with_port+'/'+controller_name+'/inputscreen3')
        aastraObj.addEntry('InputScreen4', request.protocol+request.host_with_port+'/'+controller_name+'/inputscreen4')
        aastraObj.addEntry('InputScreen5', request.protocol+request.host_with_port+'/'+controller_name+'/inputscreen5')
      when 'Aastra9480i', 'Aastra9480iCT'
        aastraObj.addEntry('Directory', request.protocol+request.host_with_port+'/'+controller_name+'/directory')
        aastraObj.addEntry('InputScreen3', request.protocol+request.host_with_port+'/'+controller_name+'/inputscreen3')
        aastraObj.addEntry('InputScreen4', request.protocol+request.host_with_port+'/'+controller_name+'/inputscreen4')
        aastraObj.addEntry('InputScreen5', request.protocol+request.host_with_port+'/'+controller_name+'/inputscreen5')
    end
    aastraObj.addEntry('FTextScreen1', request.protocol+request.host_with_port+'/'+controller_name+'/formattedtextscreen1')
    aastraObj.addEntry('FTextScreen2', request.protocol+request.host_with_port+'/'+controller_name+'/formattedtextscreen2')
    aastraObj.natsortByName
    aastra_output aastraObj
  end

  def configuration
    aastraObj = AastraIPPhoneConfiguration.new
    aastraObj.addEntry('softkey1 label', 'Test')
    aastraObj.addEntry('softkey1 type', 'xml')
    aastraObj.setTriggerDestroyOnExit
    aastraObj.setBeep
    aastra_output aastraObj
  end

  def textmenu1
    aastraObj = AastraIPPhoneTextMenu.new
    aastraObj.setTitle("Title this is a pretty long title")
    aastraObj.setTitleWrap
    aastraObj.setDestroyOnExit
    aastraObj.setDefaultIndex('3')
    aastraObj.setStyle('radio')
    aastraObj.addEntry('Choice 2', 'http://myserver.com/script.php?choice=2', 'Value=2', '', '12345')
    aastraObj.addEntry('Choice 1', 'http://myserver.com/script.php?choice=1', 'Value=1')
    aastraObj.addEntry('Choice 3', 'http://myserver.com/script.php?choice=3', 'Value=3')
    aastraObj.addEntry('Choice 4', 'http://myserver.com/script.php?choice=4', 'Value=4')
    aastraObj.addEntry('Choice 5', 'http://myserver.com/script.php?choice=5', 'Value=5')
    aastraObj.addEntry('Choice 6', 'http://myserver.com/script.php?choice=6', 'Value=6')
    aastraObj.addEntry('Choice 7', 'http://myserver.com/script.php?choice=7', 'Value=7')
    aastraObj.natsortByName
    aastraObj.addSoftkey('1', 'My Select', 'http://myserver.com/script.php?action=1')
    aastraObj.addSoftkey('2', 'My Dial', 'SoftKey:Dial2')
    aastraObj.addSoftkey('6', 'Done', 'SoftKey:Exit')
    aastra_output aastraObj
  end

  def textmenu2
    aastraObj = AastraIPPhoneTextMenu.new
    aastraObj.setTitle('Title')
    aastraObj.setDestroyOnExit
    aastraObj.setDefaultIndex('2')
    aastraObj.addEntry('Choice 2', 'http://myserver.com/script.php?choice=2', 'Value=2', '1')
    aastraObj.addEntry('Choice 1', 'http://myserver.com/script.php?choice=1', 'Value=1', '2')
    aastraObj.addEntry('Choice 3', 'http://myserver.com/script.php?choice=3', 'Value=3=', '3')
    aastraObj.natsortByName
    aastraObj.addSoftkey('1', 'My Select', 'http://myserver.com/script.php?action=1')
    aastraObj.addSoftkey('4', 'Back', request.protocol+request.host_with_port+'/'+controller_name+'')
    aastraObj.addSoftkey('6', 'Exit', 'SoftKey:Exit')
    aastraObj.addIcon('1', 'Icon:PhoneOnHook')
    aastraObj.addIcon('2', 'Icon:PhoneOffHook')
    aastraObj.addIcon('3', 'Icon:PhoneRinging')
    aastra_output aastraObj
  end

  def textmenu3
    aastraObj = AastraIPPhoneTextMenu.new
    aastraObj.setTitle('Title')
    aastraObj.setDestroyOnExit
    aastraObj.addEntry('Choice 1', 'Dial:12345', 'Value=1', '', '6789')
    aastraObj.addEntry('Choice 2', 'http://myserver.com/script.php?choice=2', 'Value=2', '', '12345')
    aastraObj.addEntry('Choice 3', 'http://myserver.com/script.php?choice=3', 'Value=3')
    aastraObj.addSoftkey('1', 'Select', 'SoftKey:Select')
    aastraObj.addSoftkey('2', 'Dial', 'SoftKey:Dial')
    aastraObj.addSoftkey('3', 'Dial2', 'SoftKey:Dial2')
    aastraObj.addSoftkey('6', 'Exit', 'SoftKey:Exit')
    aastra_output aastraObj
  end

  def textscreen
    aastraObj = AastraIPPhoneTextScreen.new
    aastraObj.setTitle('Title')
    aastraObj.setText('The screen object can be implemented similar to the firmware info screen.')
    aastraObj.setDestroyOnExit
    aastraObj.addSoftkey('1', 'Mail', 'http://myserver.com/script.php?action=1', '1')
    aastraObj.addSoftkey('6', 'Exit', 'SoftKey:Exit')
    aastraObj.addIcon('1', 'Icon:Envelope')
    aastra_output aastraObj
  end

  def inputscreen1
    aastraObj = AastraIPPhoneInputScreen.new
    aastraObj.setTitle('Title')
    aastraObj.setPrompt('Enter date')
    aastraObj.setParameter('param')
    aastraObj.setType('string')
    aastraObj.setURL('http://myserver.com/script.php?test=1')
    aastraObj.setPassword
    aastraObj.setDestroyOnExit
    aastraObj.setDefault('')
    aastraObj.setCancelAction(request.protocol+request.host_with_port+'/'+controller_name+'')
    aastra_output aastraObj
  end

  def inputscreen2
    aastraObj = AastraIPPhoneInputScreen.new
    aastraObj.setTitle('Title')
    aastraObj.setPrompt('Enter the date')
    aastraObj.setParameter('param')
    aastraObj.setType('dateUS')
    aastraObj.setURL('http://myserver.com/script.php')
    aastraObj.setDestroyOnExit
    aastraObj.setCancelAction(request.protocol+request.host_with_port+'/'+controller_name+'')
    aastra_output aastraObj
  end

  def inputscreen3
    aastraObj = AastraIPPhoneInputScreen.new
    aastraObj.setTitle('Title')
    aastraObj.setPrompt('Enter email address')
    aastraObj.setParameter('email')
    aastraObj.setType('string')
    aastraObj.setURL('http://myserver.com/script.php')
    aastraObj.addSoftkey('1', 'Backspace', 'SoftKey:BackSpace')
    aastraObj.addSoftkey('2', 'Symbols', 'SoftKey:SymbolList="@."')
    aastraObj.addSoftkey('5', 'Done', 'SoftKey:Submit')
    aastraObj.addSoftkey('6', 'Exit', 'SoftKey:Exit')
    aastraObj.setDestroyOnExit
    aastra_output aastraObj
  end

  def inputscreen4
    aastraObj = AastraIPPhoneInputScreen.new
    aastraObj.setTitle('Restricted application')
    aastraObj.setDisplayMode('condensed')
    aastraObj.setURL(request.protocol+request.host_with_port+'/'+controller_name+'')
    aastraObj.setDestroyOnExit
    aastraObj.addSoftkey('5', 'Done', 'SoftKey:Submit')
    aastraObj.addSoftkey('6', 'Exit', 'SoftKey:Exit')
    aastraObj.addField
    aastraObj.setFieldType('empty')
    aastraObj.addField('string')
    aastraObj.setFieldType('string')
    aastraObj.setFieldPrompt('Username:')
    aastraObj.setFieldParameter('user')
    aastraObj.addFieldSoftkey('3', 'ABC', 'SoftKey:ChangeMode')
    aastraObj.addField('number')
    aastraObj.setFieldPassword
    aastraObj.setFieldPrompt('Password:')
    aastraObj.setFieldParameter('password')
    aastra_output aastraObj
  end

  def inputscreen5
    aastraObj = AastraIPPhoneInputScreen.new
    aastraObj.setTitle('Date and Time')
    aastraObj.setURL('http://myserver.com/script.php')
    aastraObj.setDestroyOnExit
    aastraObj.addSoftkey('5', 'Done', 'SoftKey:Submit')
    aastraObj.addSoftkey('6', 'Exit', 'SoftKey:Exit')
    aastraObj.addField('dateUS')
    aastraObj.setFieldPrompt('Enter Date')
    aastraObj.setFieldParameter('date')
    aastraObj.addField('timeUS')
    aastraObj.setFieldPrompt('Enter Time')
    aastraObj.setFieldParameter('time')
    aastra_output aastraObj
  end

  def directory
    aastraObj = AastraIPPhoneDirectory.new
    aastraObj.setTitle('Title')
    aastraObj.setNext('http://myserver.com/script.php?page=2')
    aastraObj.setPrevious('http://myserver.com/script.php?page=0')
    aastraObj.setDestroyOnExit()
    aastraObj.addEntry('John Doe', '200')
    aastraObj.addEntry('Jane Doe', '201')
    aastraObj.natsortByName()
    aastraObj.addSoftkey('1', 'Label', 'http://myserver.com/script.php?action=1')
    aastraObj.addSoftkey('4', 'Back', request.protocol+request.host_with_port+'/'+controller_name+'')
    aastraObj.addSoftkey('6', 'Exit', 'SoftKey:Exit')
    aastra_output aastraObj
  end

  def status
    aastraObj = AastraIPPhoneStatus.new
    aastraObj.setSession('Session')
    aastraObj.setBeep
    aastraObj.addEntry('1', 'Message 1', 'alert', 5)
    aastraObj.addEntry('2', 'Message 2')
    aastra_output aastraObj
  end

  def execute
    aastraObj = AastraIPPhoneExecute.new
    aastraObj.setTriggerDestroyOnExit
    aastraObj.addEntry('http://myserver.com/script.php?choice=2')
    aastraObj.addEntry('Command: Reset')
    aastraObj.addEntry('Command: FastReboot')
    aastraObj.addEntry('Led: softkey1=on')
    aastraObj.addEntry('Dial:7001','no')
    aastra_output aastraObj
  end

  def formattedtextscreen1
    aastraObj = AastraIPPhoneFormattedTextScreen.new
    aastraObj.setDestroyOnExit
    aastraObj.addLine('Formatted Screen', 'double', 'center') if @userHeader['model'] != "Aastra53i"
    aastraObj.setScrollStart('2')
    aastraObj.addLine('Scrolled text1')
    aastraObj.addLine('Scrolled text2')
    aastraObj.addLine('Scrolled text3', 'double')
    aastraObj.addLine('Scrolled text4')
    aastraObj.addLine('Scrolled text5')
    aastraObj.setScrollEnd
    aastraObj.addLine('Footer', nil, 'center')
    aastraObj.addSoftkey('1', 'Label', 'http://myserver.com/script.php?action=1', '1')
    aastraObj.addSoftkey('4', 'Back', request.protocol+request.host_with_port+'/'+controller_name+'')
    aastraObj.addSoftkey('6', 'Exit', 'SoftKey:Exit')
    aastraObj.addIcon('1', 'Icon:Envelope')
    aastra_output aastraObj
  end

  def formattedtextscreen2
    aastraObj = AastraIPPhoneFormattedTextScreen.new
    aastraObj.setDestroyOnExit
    aastraObj.addLine('Line 1')
    aastraObj.addLine('Line 2')
    aastraObj.addLine('Line 3')
    aastraObj.addLine('Line 4')
    aastraObj.addLine('Line 5')
    aastraObj.addLine('Line 6')
    aastraObj.addSoftkey('1', 'Softkey 1', 'SoftKey:Exit')
    aastraObj.addSoftkey('2', 'Softkey 2', 'SoftKey:Exit')
    aastraObj.addSoftkey('3', 'Softkey 3', 'SoftKey:Exit')
    aastraObj.addSoftkey('4', 'Softkey 4', 'SoftKey:Exit')
    aastraObj.addSoftkey('5', 'Softkey 5', 'SoftKey:Exit')
    aastraObj.addSoftkey('6', 'Softkey 6', 'SoftKey:Exit')
    aastra_output aastraObj
  end

  def imagescreen
    aastraObj = AastraIPPhoneImageScreen.new
    aastraObj.setDestroyOnExit
    aastraObj.setSize(40, 144)
    aastraObj.setImage('fffffffc02fffffffee4ffffbfffc05fffe7ff7a7ffffffffeffeebd7fffffea6bcfffffe796f3feff6fa289f0a86f4866fa20df42414595dd0134f8037ed1637f0e2522b2dd003b6eb936f05fffbd4f4107bba6eb0080e93715000010b754001281271408c640252081b1b22500013c5c66201368004e04467520dc11067152b82094d418e100247205805494780105002601530020931400020ac5c91088b0f2b08c21c07d0c2006009fdfe81f80efe0107fe0fb1c3ffff8ffc3fffef8f7febffbfcf87ffbff64')
    aastraObj.addSoftkey('1', 'Mail', 'http://myserver.com/script.php?action=1', '1')
    aastraObj.addSoftkey('4', 'Back', request.protocol+request.host_with_port+'/'+controller_name+'')
    aastraObj.addSoftkey('6', 'Exit', 'SoftKey:Exit', 2)
    aastraObj.addIcon('1', 'Icon:Envelope')
    aastra_output aastraObj
  end

  def imagemenu
    aastraObj = AastraIPPhoneImageMenu.new
    aastraObj.setDestroyOnExit
    aastraObj.setSize(40, 144)
    aastraObj.setImage('fffffffc02fffffffee4ffffbfffc05fffe7ff7a7ffffffffeffeebd7fffffea6bcfffffe796f3feff6fa289f0a86f4866fa20df42414595dd0134f8037ed1637f0e2522b2dd003b6eb936f05fffbd4f4107bba6eb0080e93715000010b754001281271408c640252081b1b22500013c5c66201368004e04467520dc11067152b82094d418e100247205805494780105002601530020131400020a05c91088b002b08c21c0000c200000001fe800000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020041000004008300000ff08500000000c900000000710000000000000001401400000140140000014014000001401400000140140000000000000007c0ff00000c30880000081088000008108800000c30700000062000000000003f000001e02000000330200000021000000003301e000001e0330000000021000003f033000002001e0000020000000000001e000c03fc33003c013021007c02101201f00330ff03f001e000039000003e039001e00103f003300101f8021003007c03303f003c01e000000c00001e001c03f033007802002100f002002103e000001203c401702003cc0290ff039c02902101fc02b000007c03f01a003c020039018c0ff02d03c402102703c400001203ec01e000026402b0000264029000026c029000027c01a0000338000000033800000003100000000300000000030003f00003fc03000003fc02000003fc020000030001f0000300000000030001e000030002b000030002900003fc02900003fc01a00003f00000000310030000031c01e000031f003000033f81e00003f383000001e081e000008c003000003c01e00000fc03000001f000000003d001a0000390039000039002d00003f002700000f8012000007c000000001c0000000004000000000000000000000000000')
    aastraObj.addURI('1', 'http://myserver.com/script.php?choice=1')
    aastraObj.addURI('2', 'http://myserver.com/script.php?choice=2')
    aastraObj.addSoftkey('1', 'Label', 'http://myserver.com/script.php?action=1', '1')
    aastraObj.addSoftkey('4', 'Back', request.protocol+request.host_with_port+'/'+controller_name+'')
    aastraObj.addSoftkey('6', 'Exit', 'SoftKey:Exit')
    aastraObj.addIcon('1', 'Icon:Envelope')
    aastraObj.addIcon('2', 'FFFF0000FFFF0000')
    aastra_output aastraObj
  end

end
